package com.acsior.hibernate.test;

/**
 * Генератор на баркодове на изходящи международни пратки и колети. Префиксите
 * са различни не само според вида на пратката, но и в зависимост от обявената
 * стойност. Също така алгоритъмът за генерация се различава значително от тази
 * за останалите баркодове.
 * 
 * @author mdimitrova@acsior.com - 27.03.2012
 */
public class BarcodeGeneratorOutgoingShipment {

	// Коефициенти - * 8 * 6 * 4 * 2 * 3 * 5 * 9 * 7
	private static int[] codes = new int[8];

	static {
		codes[0] = 8;
		codes[1] = 6;
		codes[2] = 4;
		codes[3] = 2;
		codes[4] = 3;
		codes[5] = 5;
		codes[6] = 9;
		codes[7] = 7;
	}

	private static int findRandomNum() {
		return 0 + (int) (Math.random() * 9);
	}

	private static String genеrateRandomOutgoingShipmentBarcode(String prefix) {
		int[] randomized = new int[8];
		for (int i = 0; i < 8; i++) {
			randomized[i] = findRandomNum();
		}

		int sum = 0;
		for (int idx = 0; idx < codes.length; idx++) {
			sum = sum + codes[idx] * Integer.valueOf(randomized[idx] + "");
		}

		int controlNum = 0;
		int calculatedControlNum = 11 - sum % 11;
		if (calculatedControlNum >= 1 && calculatedControlNum <= 9) {
			controlNum = calculatedControlNum;
		} else if (calculatedControlNum == 10) {
			controlNum = 0;
		} else if (calculatedControlNum == 11) {
			controlNum = 5;
		}

		return prefix + toArrString(randomized) + controlNum + "BG";

	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		int count = 30;

		System.out.println("===ИЗХОДЯЩИ МЕЖДУНАРОДНИ ПРАТКИ БЕЗ ОБ. СТОЙНОСТ===");
		for (int x = 0; x < count; x++) {
			System.out.println(genеrateRandomOutgoingShipmentBarcode("RI"));
		}

		System.out.println("===ИЗХОДЯЩИ МЕЖДУНАРОДНИ ПРАТКИ С ОБ. СТОЙНОСТ===");
		for (int x = 0; x < count; x++) {
			System.out.println(genеrateRandomOutgoingShipmentBarcode("VV"));
		}

		System.out.println("===ИЗХОДЯЩИ МЕЖДУНАРОДНИ КОЛЕТИ БЕЗ ОБ. СТОЙНОСТ===");
		for (int x = 0; x < count; x++) {
			System.out.println(genеrateRandomOutgoingShipmentBarcode("CP"));
		}

		System.out.println("===ИЗХОДЯЩИ МЕЖДУНАРОДНИ КОЛЕТИ С ОБ. СТОЙНОСТ===");
		for (int x = 0; x < count; x++) {
			System.out.println(genеrateRandomOutgoingShipmentBarcode("CV"));
		}
	}

	private static String toArrString(int[] arr) {
		String s = "";
		for (int element : arr) {
			s = s + element;
		}
		return s;
	}

}
